package com.shihan._02_juc_concurrent_utils._02_sync_tools.semaphore;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * @Description 使用 Semaphore 控制并发线程数的资源类
 * @Author shihan
 * @Date 2021/8/20 8:34
 * @Version 1.0
 */
public class MySemaphoreResource implements Runnable {

    // Semaphore 信号量对象（由外部传过来，保证多线程操作的时候，Semaphore 信号量是同一个）
    public Semaphore semaphore;

    public MySemaphoreResource(Semaphore semaphore) {
        this.semaphore = semaphore;
    }

    @Override
    public void run() {
        try {
            // 尝试抢占一个资源，能抢占到就执行
            // 抢占不到就被阻塞，等待有被释放的资源后，再抢占执行
            semaphore.acquire();
            System.out.println(Thread.currentThread().getName() + "抢占到资源，进行执行...");
            // 模拟业务流程，睡两秒钟
            try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); }
            System.out.println(Thread.currentThread().getName() + "释放资源...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 释放一个资源
        semaphore.release();
    }
}
